#include <stdlib.h>
#include <stdio.h>
#include <vector>

using namespace std;

typedef struct {

    double custo;
    double lucro;
    double beneficio;

} Prato;

void constroiPrato(Prato* novo, double custo, double  lucro){

    novo->custo = custo;
    novo->lucro = lucro;
    novo->beneficio = lucro / custo;

}    

void le_pratos(int quantidade, vector<Prato> &opcoes){

    
    int custo , lucro;
    Prato auxiliar;
    
    for ( int i = 0; i < quantidade; i++ ) {

      scanf("%d %d \n", &custo, &lucro);
      //printf("Li %d %d\n",custo,lucro);

      constroiPrato(&auxiliar,custo,lucro);

      opcoes.push_back(auxiliar); 

    }
}    
//imprime as opcoes
void imprimeOpcoes(int quantidade, vector<Prato> &opcoes){


    for ( int i = 0; i < quantidade; i++ ) {
         printf("[%d].custo = %2.1f\n",i,opcoes[i].custo);
         printf("[%d].lucro= %2.1f\n",i,opcoes[i].lucro);
    }

}

//imprime as cardapio 
void imprimeCardapio(int quantidade, vector<int> &cardapio, double resposta){


    //printf("Imprimindo resposta: %d", (int) cardapio.size());
    if( resposta != 0.0 ){
        for ( int i = 0; i < quantidade; i++ ) {
             printf("%d ",cardapio[i]);
        }
        printf("\n");
    }else printf("\n");

}    

double encontraProximoPrato(int qtoPratos,int *ultimoPrato,int *ultimoVezes, vector<Prato> &opcoes, vector<int> &cardapio, int *orcamento) {

    int posicaoVencedora;
    double custoBeneficioVencedor=0;
    double lucroVencedor=0;
    double auxBeneficio=0;
    double auxLucro;


    //encontra o proximo prato seguindo a estrategia gulosa de pegar o melhor custo beneficio
    for (int i = 0; i < qtoPratos; i++) {
        
           if ( i == *ultimoPrato ) {

                    if ( *ultimoVezes > 1 ) { 
                        auxBeneficio = 0;
                        auxLucro = 0;
                    }    
                    else{
                        auxLucro = opcoes[i].lucro * 0.5;
                        auxBeneficio = auxLucro / opcoes[i].custo; 
                    } 
           }else { 

                auxBeneficio = opcoes[i].beneficio;
                auxLucro= opcoes[i].lucro;
           }    


           //printf("Custo beneficio[%d]: %f\n",i,auxBeneficio); 
           //printf("[%f] > %f\n",auxBeneficio,custoBeneficioVencedor); 
           //printf("[%f] <= %d\n",opcoes[i].custo, *orcamento); 

           if ( auxBeneficio > custoBeneficioVencedor /*&& opcoes[i].custo <= *orcamento */) {
                       
                posicaoVencedora = i;
                custoBeneficioVencedor = auxBeneficio;
                lucroVencedor = auxLucro;
               // *orcamento -= opcoes[i].custo;
           }       

        

    } 

   
    //ve se consegue pagar o prato
    if ( opcoes[posicaoVencedora].custo <= *orcamento ) {
        *orcamento  -= opcoes[posicaoVencedora].custo;
    } else {
        
            return -1;
    }    

     //printf("Vencedora : %d\n",posicaoVencedora); 
    //autualiza as variaveis de controle das opcoes anteriores
    if ( posicaoVencedora == *ultimoPrato ) {
         
        ultimoVezes++;
        

    }else {

        *ultimoPrato = posicaoVencedora ;
        *ultimoVezes = 0;
    }    

    //adiciona o prato ao vetor
    cardapio.push_back(posicaoVencedora+1);


    return lucroVencedor;
}   


int encontraMaisBarato(int qtoPratos, vector<Prato> &opcoes){
        
        int resposta = 0;
        int custoAtual = opcoes[0].custo;

        for ( int i = 0; i < qtoPratos; i++) {
           
            if ( custoAtual > opcoes[i].custo){
                resposta = i;
                custoAtual = opcoes[i].custo;
            }    
        } 

        return resposta;
}    

double cardapioGuloso(int nDias,int qtoPratos, int orcamento, vector<Prato> &opcoes, vector<int> &cardapio){
    
    double resposta = 0.0;
    double aux;
    int ultimoPrato=-1;
    int ultimoVezes=0;

    int maisBarato = encontraMaisBarato(qtoPratos,opcoes);
   // printf("O Mais barato é %d\n",maisBarato);

    //verifica se é possivel montar um cardapio
    if ( (nDias * opcoes[maisBarato].custo) > orcamento) return resposta;

    for ( int i = 0; i <  nDias; i++) {
           
         aux =  encontraProximoPrato(qtoPratos, &ultimoPrato, &ultimoVezes,opcoes,cardapio,&orcamento); 
         resposta += aux; 
         //printf("Ultimo prato escolhido: %d\n",ultimoPrato);

         if ( aux == -1 ) return 0.0;
    } 

    return resposta;
}    

int main(int argc, char *argv[]){

  int nDias;
  int qtoPratos;
  int orcamento;
  double resposta;
 
  while( scanf("%d %d %d\n",&nDias,&qtoPratos, &orcamento)){
 
    //verifica se não há mais entradas
    if(nDias== 0 && qtoPratos== 0 && orcamento == 0)
      return 0;



    vector<Prato> opcoes;
    vector<int> cardapio;


    //le pratos
    le_pratos(qtoPratos,opcoes);

    //encontra o lucro total pela estrategia gulosa
    resposta = cardapioGuloso(nDias,qtoPratos,orcamento,opcoes,cardapio);
    printf("%2.1f\n",resposta);
    imprimeCardapio(nDias,cardapio,resposta);

  }//end leitura

  return 0;

}
